package com.android.clinic.app.ui.pay;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;

import com.alipay.sdk.app.PayTask;
import com.android.clinic.app.utils.Toasty;
import com.jiongbull.jlog.JLog;

import java.util.Map;

/**
 * Created by cheng on 2018/2/26.
 * 支付宝支付
 */
public class ClinicAliPay {

    public Activity context;

    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_AUTH_FLAG = 2;

    private String pay_orderInfo = "";

    private OnPaySuccessListener onPaySuccessListener;

    public void setOnPaySuccessListener(OnPaySuccessListener onPaySuccessListener) {
        this.onPaySuccessListener = onPaySuccessListener;
    }

    public ClinicAliPay() {
        super();
    }

    public ClinicAliPay(Activity context) {
        super();
        this.context = context;
    }

    /**
     * 支付宝支付业务
     * @param orderInfo orderInfo的获取必须来自服务端
     */
    public void aliPay(String orderInfo) {
        pay_orderInfo = orderInfo;
        //新开一个线程，将orderInfo字串传入到PayTask任务中去
        Runnable payRunnable = () -> {
            // 新建一个PayTask对象
            PayTask payTask = new PayTask(context);
            Map<String, String> result = payTask.payV2(pay_orderInfo, true);
            Message msg = new Message();
            msg.what = SDK_PAY_FLAG;
            msg.obj = result;
            mHandler.sendMessage(msg);
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG:
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    // 对于支付结果,请商户依赖服务端的异步通知结果.同步通知结果，仅作为支付结束的通知.
                    String resultInfo = payResult.getResult(); // 同步返回需要验证的信息
                    String payStatus = payResult.getResultStatus();
                    // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
                    JLog.i("orderInfo", resultInfo.toString());
                    if (TextUtils.equals(payStatus, "9000")) {
                        Toasty.showShort(context, "支付成功");
                        if (null != onPaySuccessListener) {
                            onPaySuccessListener.onSuccess();
                        }
                    } else {
                        // 判断resultStatus 为非“9000”则代表可能支付失败
                        // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认, 最终交易是否成功以服务端异步通知为准（小概率状态）
                        if (TextUtils.equals(payStatus, "8000")) {
                            Toasty.showShort(context, "支付结果确认中");
                        } else {
                            if (null != onPaySuccessListener) {
                                onPaySuccessListener.onFailure();
                            }
                        }
                    }
                    break;
                // 如果消息SDK已确认
                case SDK_AUTH_FLAG:
                    @SuppressWarnings("unchecked")
                    //将随该消息附带的msg.obj强转回MAP,第二个参数为“去除消息中包含的括号吗?（boolean）
                    //新建自定义的authResult对象
                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                    //利用AuthResult中的自定义方法的到resultStatus
                    String authStatus = authResult.getResultStatus();

                    // 判断resultStatus 为“9000”且result_code
                    // 为“200”则代表授权成功，具体状态码代表含义可参考授权接口文档
                    if (TextUtils.equals(authStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 获取aliPay_open_id，调支付时作为参数extras_token的value
                        // 传入，则支付账户为该授权账户
                        Toasty.showShort(context,
                                "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()));
                    } else {
                        // 其他状态值则为授权失败
                        Toasty.showShort(context,
                                "授权失败" + String.format("authCode:%s", authResult.getAuthCode()));

                    }
                    break;
                default:break;
            }
        }
    };

    public interface OnPaySuccessListener {
        void onSuccess();
        void onFailure();
    }

}
